package cn.tedu.csmall.product.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

/**
 *  统计程序耗时的切面类
 * @author 程旭东
 */
@Slf4j
@Aspect
@Component
public class TimerAspect {

    @Around("execution(* cn.tedu.csmall.product.service.*.*(..))")
    //                 ^ 第一个是参数对应的返回值类型
    //                                                  ^ 第二个是对应的类名
    //                                                    ^ 第三个是对应的方法名
    //                                                        ^ 第四个是方法中的参数列表

    public Object timer(ProceedingJoinPoint pjp) throws Throwable {
        log.info("执行了TimerAspect中test方法");
        long start = System.currentTimeMillis();
        Object proceed = pjp.proceed();// 执行链接点方法

        Object[] args = pjp.getArgs();
        Signature signature = pjp.getSignature();
        String name = pjp.getTarget().getClass().getName();

        log.debug("{}类的对象调用了{}方法，方法的参数类型为【{}】",name,signature,args);

        long end = System.currentTimeMillis();
        log.info("方法所消耗时间为：{}",(end-start));
        return proceed;
    }
}
